//以下所有都是在//     "strict": true, "strictNullChecks": false, 
//---------------------1、基本类型：标识都是小写;大写的都是装箱类型（包装类型）---------------------

let s1:string='aaa'
//错误
// let s2:string=new String('fff'); //创建的实力，不能通过小写来描述
let s3:String=new String('ddd');
let s4:String='eee';

//---------------------2、大写的都是装箱类型（包装类型）---------------------
let arr1:number[]=[1,2,3];
let arr2:string[]=['1','2','3'];
let arr3:(string | number)[]=['1','2','3'];
let arr4:(string | number)[]=[1,2,3];
let arr5:(string | number)[]=[1,2,3];
let arr6:Array<number | string>=[1,2,'3'];

//---------------------3、元组：规定长度和存储的类型---------------------
let typle1:[string,number,string]=['w',1,'f']
//添加只能添加元组中已经存在的类型
typle1.push(2)
//错误
// typle1[3] //不是规定的元素，不让获取，为了安全，因为无法确定这个值是否存在


let typle2:readonly[string,number,string]=['w',1,'f']
//错误
// typle2.push(5) //只读数据，不可以修改
export{}

//---------------------4、枚举类型：自带类型的对象，索引自动增长（0=>自增）。数字类型的枚举可以反举---------------------
enum USEAR_ROLE{
    USEAR,
    ADMIN,
    OTHER
}
//异构枚举：索引自定义
enum USEAR_ROLE2{
    USEAR,
    ADMIN=6,
    MANAGER,
    OTHER='ABC'
}
USEAR_ROLE[0]//USEAR
USEAR_ROLE.USEAR//0

//---------------------5、非严格模型模式下，null和undefined是任何类型的字类型---------------------
// let str:string=null //strictNullChecks=false

//---------------------6、void：代表函数的返回值为空，只能在函数中使用---------------------
//错误
function fn1(){
    return undefined
}
function fn2():void{
    return undefined
}

//---------------------7、never：永远不会出现，是任何类型的子类型---------------------
function fun3():never{
    throw new Error()
}
function func4():never{
    while(true){}
}
let a=fun3() //a的类型是never
//类型保护，保障程序的不缺失，代码完整性保护
function validate(val:never){

}
function getResult(val:string | number | boolean){
    if(typeof val ==='string') return val
    if(typeof val ==='number') return val
    //错误
    // validate(val) //会发现代码没有判断完成
}
function getResult2(val:string | number | boolean){
    if(typeof val ==='string') return val
    if(typeof val ==='number') return val
    if(typeof val ==='boolean') return val
    validate(val)
}

//---------------------8、object：对象类型，是非基础类型---------------------
// object 、 {}、Object
let obj1:Object='123' //Object可以赋值任何类型-不采用
let obj2:{}='123' //{}可以赋值任何类型-不采用
let obj3:object={} //{} []等

//---------------------9、symbol(唯一类型)，BigInt(大值)---------------------
let sy1:symbol=Symbol(1)
let sy2:symbol=Symbol(2)
console.log(sy1===sy2);//false
let b1:bigint=BigInt(Number.MAX_SAFE_INTEGER+100)


//---------------------10、any:任何类型,anyscript,使用场景：有时候我们需要对类型做转化，无法直接转化，你认为这个值可以赋值给任何类型了---------------------
//出错自己负责
let name;//申明一个变量，不给默认类型就是any

